#ifndef DISPLAYCANVASCALCULATOR_H
#define DISPLAYCANVASCALCULATOR_H

#include <QScreen>
#include <QSize>
#include <QGuiApplication>
#include <QSizeF>

/**
 * 显示画布计算器
 * 职责：计算基于显示器的物理画布尺寸
 * 重构原则：Extract Method - 将复杂计算逻辑提取到专门类
 *
 * Martin Fowler重构：Replace Magic Number with Symbolic Constant
 * 所有物理尺寸和DPI计算都使用标准常量
 */
class DisplayCanvasCalculator
{
public:
    /**
     * 显示器信息结构体
     * 重构原则：Introduce Parameter Object - 将相关参数组织到一个对象中
     */
    struct DisplayInfo {
        QScreen* screen;                // 当前屏幕对象
        double physicalDpi;            // 物理DPI（实际硬件DPI）
        double logicalDpi;             // 逻辑DPI（Qt报告的DPI）
        QSize screenSize;              // 屏幕尺寸（像素）
        QSizeF physicalSizeMM;         // 屏幕物理尺寸（毫米）
        double devicePixelRatio;       // 设备像素比（用于高DPI屏幕）

        // 便利方法
        bool isHighDpiScreen() const { return devicePixelRatio > 1.0; }
        double getEffectiveDpi() const { return logicalDpi * devicePixelRatio; }
    };

    // === A4标准尺寸常量 ===
    // Martin Fowler: Replace Magic Number with Symbolic Constant
    static constexpr double A4_WIDTH_MM = 210.0;      // A4宽度（毫米）
    static constexpr double A4_HEIGHT_MM = 297.0;     // A4高度（毫米）
    static constexpr double MM_PER_INCH = 25.4;       // 毫米每英寸转换常量
    static constexpr double POINTS_PER_INCH = 72.0;   // 点每英寸（PostScript标准）

    // === 推荐DPI常量 ===
    static constexpr double RECOMMENDED_DISPLAY_DPI = 96.0;   // Windows标准显示DPI
    static constexpr double MACOS_DISPLAY_DPI = 72.0;         // macOS传统显示DPI
    static constexpr double PRINT_STANDARD_DPI = 300.0;       // 打印标准DPI

    // === 主要计算方法 ===

    /**
     * 获取当前显示器信息
     * @param screen 指定屏幕，nullptr表示主屏幕
     * @return 显示器详细信息
     */
    static DisplayInfo getCurrentDisplayInfo(QScreen* screen = nullptr);

    /**
     * 计算A4纸在当前显示器上的物理像素尺寸
     * 这是WYSIWYG的关键：在屏幕上显示真实A4大小
     * @param display 显示器信息
     * @return A4纸的像素尺寸
     */
    static QSize calculateA4PhysicalSize(const DisplayInfo& display);

    /**
     * 获取推荐的显示DPI
     * 根据平台和显示器特性返回最适合的显示DPI
     * @param display 显示器信息
     * @return 推荐的显示DPI值
     */
    static double getRecommendedDisplayDpi(const DisplayInfo& display);

    /**
     * 计算指定尺寸在显示器上的像素大小
     * @param sizeMM 物理尺寸（毫米）
     * @param display 显示器信息
     * @return 对应的像素尺寸
     */
    static QSize calculatePhysicalPixelSize(const QSizeF& sizeMM, const DisplayInfo& display);

    /**
     * 计算DPI转换比例
     * @param sourceDpi 源DPI
     * @param targetDpi 目标DPI
     * @return 缩放比例
     */
    static double calculateDpiScaleFactor(double sourceDpi, double targetDpi);

    // === 调试和诊断方法 ===

    /**
     * 获取显示器诊断信息（用于调试）
     * @param display 显示器信息
     * @return 格式化的诊断字符串
     */
    static QString getDisplayDiagnostics(const DisplayInfo& display);

    /**
     * 验证DPI计算的准确性
     * @param display 显示器信息
     * @return 如果计算合理返回true
     */
    static bool validateDpiCalculation(const DisplayInfo& display);

private:
    // === 内部辅助方法 ===

    /**
     * 检测平台特定的DPI处理方式
     * @return 平台推荐的基础DPI
     */
    static double getPlatformBaseDpi();

    /**
     * 处理高DPI屏幕的特殊情况
     * @param display 显示器信息
     * @return 修正后的DPI值
     */
    static double adjustForHighDpiScreen(const DisplayInfo& display);

    /**
     * 毫米转像素的精确计算
     * @param mm 毫米值
     * @param dpi DPI值
     * @return 像素值
     */
    static int mmToPixels(double mm, double dpi);

    /**
     * 像素转毫米的精确计算
     * @param pixels 像素值
     * @param dpi DPI值
     * @return 毫米值
     */
    static double pixelsToMM(int pixels, double dpi);
};

#endif // DISPLAYCANVASCALCULATOR_H